<html>

	<head>
		<title>5.15 Generator 与 JavaBean</title>
		<meta charset="utf-8" />
		<meta name="author" content="jfinal,yaolin" />
		<meta name="Keywords" content="" />
		<link rel="stylesheet" type="text/css" href="../../css/global.css" />
	</head>

	<body>
		<h1>5.15 Generator 与 JavaBean</h1>
		<p>ActiveRecord 模块提供了 ModelGenerator、 BaseModelGenerator、 MappingKitGernator、 DataDictionaryGenerator， 可分别生成 Model、 BaseModel、 MappingKit、 DataDictionary 四类文 件。可根据数据表自动化生成这四类文件。
		</p>
		<p>生成后的 Model 继承自 BaseModel 而非继承自 Model， BaseModel 中拥有 getter、 setter 方 法遵守传统 java bean 规范， Model 继承自 BaseModel 即完成了 JavaBean 与 Model 合体，拥有 了传统 JavaBean 所有的优势，并且所有的 getter、 setter 方法完全无需人工干预，数据表有任 何变动一键重新生成即可。
		</p>
		<p>使 用 时 通 常 只 需 配 置 Generator 的 四 个 参 数 即 可 ： baseModelPackageName 、 baseModelOutputDir、 modelPackageName、 modelOutputDir。四个参数分别表示 baseMode 的包 名， baseModel 的输出路径， modle 的包名， model 的输出路径，以下是示例代码：</p>
		<img src="../../images/ativeRecord/5.15.1.png" />
		<p>可在 JFinal 官网下载源码直接用于项目：<a href=" http://www.jfinal.com" target="_blank" class="blue"> http://www.jfinal.com</a></p>
		<h3>相关生成文件</h3>
		<p>BaseModel 是用于被最终的 Model 继承的基类，所有的 getter、 setter 方法都将生成在此文 件内，这样就保障了最终 Model 的清爽与干净， BaseModel 不需要人工维护，在数据库有任何 变化时重新生成一次即可。
		</p>
		<p>MappingKit 用于生成 table 到 Model 的映射关系，并且会生成主键/复合主键的配置，也即 无需在 configPlugin(Plugins me)方法中书写任何样板式的映射代码。</p>
		<p>DataDictionary 是指生成的数据字典，会生成数据表所有字段的名称、类型、长度、备注、 是否主键等信息。
		</p>
		<h3>Model 与 Bean 合体后主要优势</h3>
		<ul>
			<li>充分利用海量的针对于 Bean 设计的第三方工具，例如 jackson、 freemarker</li>
			<li>快速响应数据库表变动，极速重构，提升开发效率，提升代码质量</li>
			<li>拥有 IDE 代码提示不用记忆数据表字段名，消除记忆负担，避免手写字段名出现手误</li>
			<li>BaseModel 设计令 Model 中依然保持清爽，在表结构变化时极速重构关联代码</li>
			<li>自动化 table 至 Model 映射</li>
			<li>自动化主键、复合主键名称识别与映射</li>
			<li>MappingKit 承载映射代码， JFinalConfig 保持干净清爽</li>
			<li>有利于分布式场景和无数据源时使用 Model</li>
			<li>新设计避免了以往自动扫描映射设计的若干缺点：引入新概念(如注解)增加学习成本、性 能低、 jar 包扫描可靠性与安全性低</li>
		</ul>
		<h3>Model 与 Bean 合体后注意事项</h3>
		<ul>
			<li>合体后 JSP 模板输出 Bean 中的数据将依赖其 getter 方法，输出的变量名即为 getter 方法去 掉”get”前缀字符后剩下的字符首字母变小写，如果希望 JSP 仍然使用之前的输出方式，可 以在系统启动时调用一下 ModelRecordElResolver. setResolveBeanAsModel(true);</li>
			<li>合体后 JSP 模板输出 Bean 中的数据将依赖其 getter 方法，输出的变量名即为 getter 方法去 掉”get”前缀字符后剩下的字符首字母变小写，如果希望 JSP 仍然使用之前的输出方式，可 以在系统启动时调用一下 ModelRecordElResolver. setResolveBeanAsModel(true);</li>
			<li>Controller 之中的 getModel()需要表单域名称对应于数据表字段名， 而 getBean()则依赖于 setter 方法，表单域名对应于 setter 方法去掉”set”前缀字符后剩下的字符串字母变小写。</li>
			<li>许多类似于 jackson、 fastjson 的第三方工具依赖于 Bean 的 getter 方法进行操作，所以只有 合体后才可以使用 jackson、 fastjson</li>
			<li>JFinalJson将 Model转换为 json数据时，json的 keyName是原始的数据表字段名，而 jackson、 fastjson 这类依赖于 getter 方法转化成的 json 的 keyName 是数据表字段名转换而成的驼峰 命名
			</li>
			<li>建议 mysql 数据表的字段名直接使用驼峰命名，这样可以令 json 的 keyName 完全一致， 也可以使 JSP 在页面中取值时使用完全一致的属性名。注意： mysql 数据表的名称仍然使 用下划线命名方式并使用小写字母，方便在 linux 与 windows 系统之间移植。</li>
			<li>总之，合体后的 Bean 在使用时要清楚使用的是其 BaseModel 中的 getter、 setter 方法还是 其 Model 中的 get(String attrName)方法</li>
		</ul>
	</body>

</html>